from operator import ne
from flask import Blueprint,request,jsonify
#密码加密
from werkzeug.security import generate_password_hash,check_password_hash
from conf.comm import sqlalchemy_context
from database import *
import json
import re
import random
from utils.comm import send_message
from utils.redisconn import r
import os
import uuid

#蓝图初始化
bp_users = Blueprint('users',__name__)
#注册功能实现
@bp_users.route('/reg',methods=['POST'])
@sqlalchemy_context()
def reg():
    #获取用户输入
    data = request.data
    if not data:
        data = request.form
    else:
        data = json.loads(data)
    #有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$',data['mobile'])
    if not reg:
        return jsonify({"code":10012,'mes':'手机号不合法'})
    #构造user
    try:
         user = User(username=data['username'],password=generate_password_hash(data['password']),mobile=data['mobile'])
         db.session.add(user)
         db.session.commit()
         return jsonify({"code":200})
    except:
        return jsonify({"code":10010}) 

#发送验证码
@bp_users.route('/sendsms',methods=['POST'])
def sendsms():
    #传递手机号
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    #有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$',data['mobile'])
    if not reg:
        return jsonify({"code":10012,'mes':'手机号不合法'})
    #验证是否30秒内已经发过验证码
    code  = r.get_str(mobile)
    if code:
        return jsonify({"code":10015,'mes':'30秒内您已经发过验证码'})
    else:
        pass
    #生成验证码
    code = str(random.randint(100000,999999))
    print(code)
    #调用短信接口
    flag = send_message(mobile,code,1)
    print(flag)
    if flag:
        #发送成功，存入redis
        r.set_str(mobile,code,60)
        #返回结果（验证码）
        return jsonify({'code':200,'smscode':code})
    else:
        return jsonify({'code':20011,'mes':'发送失败，请重试'})


from utils.myjwt import myjwt
@bp_users.route('/login',methods=['POST'])
def login():
    #获取用户输入
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    #用户输入的验证码
    code = data['code']
    # 通过手机号redis查
    rcode = r.get_str(mobile)
    print(rcode)
    # 存在值对比-》
    if rcode:
        if int(code) == int(rcode):
            # 用手机号生成一个新用户
            user = User.query.filter_by(mobile=mobile).first()
            #用户不存在添加
            if not user:
                user = User(username=mobile,mobile=mobile)
                db.session.add(user)
                db.session.commit()
                #清除redis
            r.del_str(mobile)
            # 返回结果（pyjwt生成token）
            # token = myjwt.jwt_encode({'data':{'username':user.username,'userid':user.id}})
            # return jsonify({"code":200,'userid':user.id,'username':user.username,'token':token})
            return jsonify({'code':200,'userid':user.id,'username':user.username,})
        else:
            #不存在返回
            return jsonify({"code":20013,'mes':'验证码错误，请重新输入'})
    else:
     #不存在返回
        return jsonify({"code":20012,'mes':'验证码不存在，请重新发送'})


#返回用户信息接口
# @bp_users.route('/getuserinfo')
# def getuserinfo():
#     #获取token
#     try:
#         token = request.headers['Token']
#     except:
#         return jsonify({"code":403,'mes':'请传递token'})
#     #解密重新对比token
#     newtoken = myjwt.jwt_decode(token)
#     if newtoken and myjwt.check(token,newtoken):
#         #数据库查询返回
#         id = request.args.get('userid')
#         User.query.filter_by(id=id).first()
#         return 'ok'
#     else:
#         return jsonify({"code":403,'mes':'无权访问'})b

@bp_users.route('getuserinfo')
def get():
    # 数据库查询返回
    id = request.args.get('userid')
    user = User.query.filter_by(id=id).first()
    dict={}
    dict['id']=user.id
    dict['username']=user.username
    dict['mobile']=user.mobile
    dict['avater']= user.avater
    return jsonify({'code':200,'user':dict})


@bp_users.route('/upload',methods=['POST'])
def upload():
    # 获取前端文件
    file = request.files['file']
    # 上传到upload文件夹里
    # 解决文件名被覆盖的问题
    # 1.文件重命名
    filetext = os.path.splitext(file.filename)[1]
    newfile =uuid.uuid4().hex+filetext
    # 2.在upload下面建立一个文件夹，专业存文件夹的名字为userid
    userid = request.form.get('userid')
    # 根据userid创建文件夹
    # 判断此用户文件夹是否存在，存在直接写文件，不存在创建
    path = './static/upload/'+str(userid)
    # 不存在创建
    if not os.path.exists(path):
        os.mkdir(path)
    file.save(os.path.join(path,newfile))
    # 更新数据库
    User.query.filter_by(id=userid).update({'avater':newfile})
    db.session.commit()
    return jsonify({'code':200,'filename':newfile})





# @bp_users.route('/add',methods=['POST'])
# def addconser():
#     # request.data == 'POST':
#         file = request.files['file']
#         # 上传到upload文件夹里
#         # 解决文件名被覆盖的问题
#         # 1.文件重命名
#         filetext = os.path.splitext(file.filename)[1]
#         newfile =uuid.uuid4().hex+filetext
        
#         data = request.data
#         name = json.loads(data['name'])
     
#         path = './static/upload/'+name
#         # 不存在创建
#         if not os.path.exists(path):
#             os.mkdir(path)
#         file.save(os.path.join(path,newfile))
#         # 更新数据库
#         User.query.filter_by(name=name).update({'pic':newfile})
#         db.session.commit()
#         return jsonify({'code':200,'filename':newfile})

# @bp_users.route('/get',methods=['GET'])
# def getconser():
#         name = request.args.get('name')
#         user = User.query.filter_by(name=name).first()
#         dict={}
#         dict['id']=user.id
#         dict['name']=user.name
#         dict['pic']= user.pic
#         return jsonify({'code':200,'user':dict})


from utils.myfiles import myf
@bp_users.route('/getFiles',methods=['GET','DELETE'])
def getFile():
    if request.method == 'GET':
        # 获取id
        id= request.args.get('userid')
        # 根据用户id调用文件类获取所有文件
        list = myf.show_all(id)
        filelist = []
        for i in list:
            dict= {}
            dict['name']=i
            dict['url']='http://localhost:5000/static/upload/'+str(id)+"/"+str(i)
            filelist.append(dict)
        return jsonify({'code':200,'list':filelist})


    elif request.method=='DELETE':
        #删除
        #获取userid，文件名
        userid = request.args.get('userid')
        filename = request.args.get('filename')
        #调用删除文件方法
        myf.remove_file(userid,filename)
        #返回结果
        return jsonify({"code":200})